home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / qed_397 / sourcen / wp_print.c < prev    next >
C/C++ Source or Header  |  1996-12-29  |  8KB  |  419 lines

  1. /*
  2.  * Dieses Modul basiert auf einem Modula2-Quelltext von Uwe Mindrup @ LB
  3. */
  4. #include <string.h>
  5. #include <tos.h>
  6. #include <time.h>
  7.  
  8. #include "wp-print.h"
  9.  
  10. /*
  11.  * Exportierte Variablen
  12. */
  13. GLOBAL    BOOLEAN    wp_config_read = FALSE;
  14.  
  15.  
  16. #define MaxSequence        0x4F
  17. #define MaxTranslations 0xFF
  18. /* es folgen die Konstanten für den Tabelleneingang der Funktionen: */
  19. #define VERTPOS            5
  20. #define BOLD                6
  21. #define ITALIC             0xA
  22. #define LIGHT                0xE
  23. #define SUPERSCRIPT        0x12
  24. #define SUBSCRIPT         0x16
  25. #define _UNDERLINE         0x1A
  26. #define HORZINIT            0x1F
  27. #define VERTINIT            0x20
  28. #define PRINTERINIT        0x21
  29.  
  30. #define _1STTYPE            0x28
  31. #define _1STCOLOR         0x30
  32. #define PROP                0x35
  33. #define FORMFEED            0x1E
  34. #define WRITELN            1
  35. #define TAB                 0x09
  36.  
  37. typedef struct
  38. {
  39.     WORD    len;
  40.     WORD    pos;
  41. } TABLEENTRY;
  42.  
  43.  
  44. /*
  45.  * lokale Variablen
  46. */
  47. LOCAL TABLEENTRY    SeqTable[MaxSequence + 1],
  48.                          TransTable[MaxTranslations + 1];
  49. LOCAL UBYTE         *cfgPtr;
  50. LOCAL WORD            PrnHdl,
  51.                         CharPos,                     /* Position des Zeichens in der aktuellen Zeile */
  52.                         NrSpaces,                    /* Anzahl Leerzeichen */
  53.                         NLQSet,                        /* [0..2] */
  54.                         AktMode,    AktColor,
  55.                         TabSize,
  56.                         PropSize;
  57. LOCAL BOOLEAN        Proportional;
  58.  
  59.  
  60. /*
  61.  * lokale Prozeduren
  62. */
  63. LOCAL VOID InitTables(VOID)                        /* Tabellen initialisieren */
  64. {
  65.     WORD    i;
  66.  
  67.     for (i = 0; i <= MaxSequence; i++)
  68.         SeqTable[i].len = 0;
  69.     for (i = 0; i <= MaxTranslations; i++)
  70.         TransTable[i].len = 0;
  71.     CharPos = 0;
  72. }
  73.  
  74. LOCAL BOOLEAN Out(UBYTE ch)
  75. {
  76.     if (PrnHdl == -2)
  77.         Cauxout(ch);
  78.     else if (PrnHdl == -3)
  79.         Cprnout(ch);
  80.     else
  81.         Fwrite(PrnHdl, 1, &ch);
  82.     return TRUE;
  83. }
  84.  
  85.  
  86. LOCAL BOOLEAN PrintSeq(WORD which)
  87. {
  88.     WORD        i;
  89.     BOOLEAN    ok;
  90.  
  91.     for (i = SeqTable[which].pos; i <= SeqTable[which].pos + SeqTable[which].len - 1; i++)
  92.     {
  93.         ok = Out(cfgPtr[i]);
  94.         if (!ok)
  95.             break;
  96.     }
  97.     return ok;
  98. }
  99.  
  100.  
  101. LOCAL BOOLEAN Print(WORD entry, BOOLEAN set)        /* Ausgabe der angewählten Steuersequenz */
  102. {
  103.     if (!set)
  104.         entry++;
  105.     return PrintSeq(entry + NLQSet);
  106. }
  107.  
  108.  
  109. LOCAL BOOLEAN WriteChar(UBYTE ch)
  110. {
  111.     WORD        i;
  112.     BOOLEAN    ok;
  113.  
  114.     if (TransTable[ch].len > 0)
  115.     {
  116.         for (i = TransTable[ch].pos; i <= TransTable[ch].pos + TransTable[ch].len - 1; i++)
  117.         {
  118.             ok = Out(cfgPtr[i]);
  119.             if (!ok)
  120.                 break;
  121.         }
  122.         CharPos++;
  123.     }
  124.     else
  125.     {
  126.         ok = Out(ch);
  127.         CharPos++;
  128.     }
  129.     return ok;
  130. }
  131.  
  132.  
  133. LOCAL BOOLEAN SetHead(VOID)                            /*  Druckkopf neu positionieren */
  134. {
  135.     WORD        i, len, pos;
  136.     BOOLEAN    ok;
  137.  
  138.     len = SeqTable[VERTPOS].len;
  139.     pos = SeqTable[VERTPOS].pos;
  140.     for (i = pos; i <= pos + len - 1; i++)
  141.     {
  142.         if (cfgPtr[i] == 0x80)
  143.             ok = Out((CharPos * 60 / PropSize) % 256);
  144.         else if (cfgPtr[i] == 0x81)
  145.             ok = Out((CharPos * 60 / PropSize) / 256);
  146.         else
  147.             ok = Out(cfgPtr[i]);
  148.         if (!ok)
  149.             break;
  150.     }
  151.     NrSpaces = 0;
  152.     return ok;
  153. }
  154.  
  155.  
  156. /*
  157.  * exportierte Prozeduren
  158. */
  159. GLOBAL BOOLEAN WPLoadCFGFile(UBYTE *name)
  160. {
  161.     LONG        Length, err;
  162.     WORD        f, i, j, Pos, Len;
  163.  
  164.     if (wp_config_read)                                    /* Config bereits geladen */
  165.         return TRUE;
  166.  
  167.     err = Fopen(name, FO_READ);
  168.     if (err < 0)
  169.         return FALSE;
  170.     f = (short)err;
  171.  
  172.     if (cfgPtr != NULL)
  173.         Mfree(cfgPtr);
  174.  
  175.     Length = Fseek(0, f, 2);                        /* ganz ans Ende */
  176.  
  177.     cfgPtr = Malloc(Length);
  178.     if (cfgPtr == NULL)
  179.     {
  180.         Fclose(f);
  181.         return FALSE;
  182.     }
  183.  
  184.     Fseek(0, f, 0);                                    /* zurück zum Anfang */
  185.     err = Fread(f, Length, cfgPtr);
  186.     Fclose(f);
  187.  
  188.     InitTables();
  189.  
  190.     /* Kennung überprüfen: */
  191.     if (strncmp(cfgPtr, "GST-CFG:", 8) != 0)
  192.         return FALSE;                                    /* keine GST-CFG-Datei !!! */
  193.  
  194.     /* Jetzt müssen die Tabellen aufgebaut werden: */
  195.     i = 8;                                                /* Druckernamen überspringen */
  196.     while (cfgPtr[i] != '\0')
  197.         i++;
  198.     i += 7;                                                /* Druckeranpassungen interessieren nicht.  */
  199.  
  200.     /* zunächst die Tabelle der Druckerbesonderheiten:  */
  201.     while (cfgPtr[i] != '\0')                        /* Tabelle wird mit einem NUL-Byte beendet */
  202.     {
  203.         Len = cfgPtr[i];
  204.         Pos = cfgPtr[i+1];                            /* Tabelleneintrag */
  205.         SeqTable[Pos].len = Len - 2;
  206.         SeqTable[Pos].pos = i + 2;
  207.         i += Len;
  208.     }
  209.     i++;                                                    /* Tabellenende überspringen */
  210.  
  211.     /* jetzt die ÜbersetzungsTabelle:    */
  212.     while (cfgPtr[i] != '\0')                        /* Tabelle wird mit einem NUL-Byte beendet */
  213.     {
  214.         Len = cfgPtr[i];
  215.         Pos = cfgPtr[i+1];
  216.         TransTable[Pos].len = Len - 2;
  217.         TransTable[Pos].pos = i + 2;
  218.         i += Len;
  219.     }
  220.  
  221.     /* Optimierung der Druckercharakteristik-Tabelle: */
  222.     /* 1. die Texteffekte: */
  223.     for (i = BOLD; i <= _UNDERLINE; i+=4)
  224.         for (j = i; j <= i+1; j++)
  225.         {
  226.             if ((SeqTable[j].len == 0) && (SeqTable[j+2].len != 0))
  227.                 SeqTable[j] = SeqTable[j+2];
  228.             if ((SeqTable[j+2].len == 0) && (SeqTable[j].len != 0))
  229.                 SeqTable[j+2] = SeqTable[j];
  230.         }
  231.  
  232.     /* 2. die Schriftarten: */
  233.     for (i = _1STTYPE; i <= _1STTYPE + 6; i+=2)
  234.     {
  235.         if ((SeqTable[i].len == 0) && (SeqTable[i+1].len != 0))
  236.             SeqTable[i] = SeqTable[i+1];
  237.         if ((SeqTable[i+1].len == 0) && (SeqTable[i].len != 0))
  238.             SeqTable[i+1] = SeqTable[i];
  239.     }
  240.     wp_config_read = TRUE;
  241.     return TRUE;
  242. }
  243.  
  244.  
  245. GLOBAL VOID WPGetPrnName(UBYTE *Printername, WORD max_len)
  246. {
  247.     WORD    i;
  248.  
  249.     if (cfgPtr != NULL)
  250.     {
  251.         i = 8;
  252.         while ((cfgPtr[i] != '\0') && (i < (max_len + 8)))
  253.         {
  254.             Printername[i-8] = cfgPtr[i];
  255.             i++;
  256.         }
  257.         Printername[i - 8] = '\0';
  258.     }
  259.     else
  260.         Printername[0] = '\0';
  261. }
  262.  
  263. GLOBAL BOOLEAN WPSendInit(BOOLEAN use_nlq)
  264. {
  265.     BOOLEAN    ok;
  266.  
  267.     if (use_nlq)
  268.         NLQSet = 2;
  269.     else
  270.         NLQSet = 0;
  271.     PrintSeq(HORZINIT);                    /* Horizontale Initialisierung */
  272.     PrintSeq(VERTINIT);                    /* Vertikale Initialisierung    */
  273.     Print(BOLD, FALSE);                    /* Fettschrift aus.                */
  274.     Print(ITALIC, FALSE);                /* Kursivschrift aus.             */
  275.     Print(LIGHT, FALSE);                    /* Light aus.                        */
  276.     Print(SUPERSCRIPT, FALSE);            /* Superscript aus.                */
  277.     Print(SUBSCRIPT, FALSE);            /* Subscript aus.                    */
  278.     Print(_UNDERLINE, FALSE);            /* Unterstreichung aus.            */
  279.       AktMode = -1;
  280.      PrintSeq(_1STTYPE);                    /* PICA (10 CPI)                    */
  281.     AktColor = -1;
  282.     PrintSeq(_1STCOLOR);                    /* Color-Einstellung: Black.    */
  283.     Proportional = FALSE;
  284.     ok = PrintSeq(PROP + 1);            /* Proportional-Schrift aus.    */
  285.     return ok;
  286. }
  287.  
  288.  
  289. GLOBAL BOOLEAN WPSendExit(VOID)
  290. {
  291.     return PrintSeq(PRINTERINIT);
  292. }
  293.  
  294.  
  295. GLOBAL BOOLEAN WPSetMode(WORD mode)
  296. {
  297.     BOOLEAN    ok = TRUE;
  298.  
  299.     if ((mode >= PICA) && (mode <= EXPANDED))
  300.     {
  301.         if (mode != AktMode)
  302.         {
  303.             ok = PrintSeq(2 * mode + _1STTYPE + (NLQSet / 2));
  304.             AktMode = mode;
  305.         }
  306.     }
  307.     return ok;
  308. }
  309.  
  310.  
  311. GLOBAL BOOLEAN WPFormFeed(VOID)
  312. {
  313.     return PrintSeq(FORMFEED);
  314. }
  315.  
  316.  
  317. GLOBAL VOID WPSetTabSize(WORD tab)
  318. {
  319.     TabSize = tab;
  320. }
  321.  
  322.  
  323. GLOBAL BOOLEAN WPWriteLn(VOID)
  324. {
  325.     BOOLEAN    ok;
  326.  
  327.     ok = PrintSeq(WRITELN);
  328.     CharPos = 0;
  329.     return ok;
  330. }
  331.  
  332.  
  333. GLOBAL BOOLEAN WPWrite(UBYTE ch)
  334. {
  335.     WORD        i;
  336.     BOOLEAN    ok;
  337.  
  338.     if ((ch == TAB) || (ch == ' '))
  339.     {
  340.         if (Proportional)
  341.         {
  342.             if  (ch == ' ')
  343.             {
  344.                 CharPos++;
  345.                 NrSpaces++;
  346.             }
  347.             else
  348.             {
  349.                 CharPos += TabSize;
  350.                 NrSpaces += TabSize;
  351.             }
  352.         }
  353.         else
  354.         {
  355.               if (ch == ' ')
  356.                 ok = WriteChar(' ');
  357.             else
  358.                  for (i = 1; i <= TabSize; i++)
  359.                     ok = WriteChar(' ');
  360.         }
  361.     }
  362.     else
  363.     {
  364.         if (NrSpaces > 1)
  365.             ok = SetHead();
  366.         else if (NrSpaces == 1)
  367.         {
  368.             ok = WriteChar(' ');
  369.             NrSpaces = 0;
  370.         }
  371.         ok = WriteChar(ch);
  372.     }
  373.     return ok;
  374. }
  375.  
  376.  
  377. GLOBAL BOOLEAN WPWriteString(UBYTE *Str)
  378. {
  379.     WORD        i;
  380.     BOOLEAN    ok = TRUE;
  381.  
  382.     i = 0;
  383.     while ((Str[i] != '\0') && ok)
  384.     {
  385.         ok = WPWrite(Str[i]);
  386.         i++;
  387.     }
  388.     return ok;
  389. }
  390.  
  391.  
  392. GLOBAL BOOLEAN WPOpen(UBYTE *name)
  393. {
  394.     LONG    err;
  395.  
  396.     if (strcmp(name, "PRN:") == 0)
  397.         PrnHdl = -3;
  398.     else if (strcmp(name, "AUX:") == 0)
  399.         PrnHdl = -2;
  400.     else
  401.     {
  402.         err = Fopen(name, FO_WRITE);
  403.         if (err == -33)
  404.             err = Fcreate(name, 0);
  405.         else if (err > 0)
  406.         {
  407.             PrnHdl = (short) err;
  408.             Fseek(0, PrnHdl, 2);
  409.         }
  410.     }
  411.     return (PrnHdl > -31);
  412. }
  413.  
  414.  
  415. GLOBAL VOID WPClose(VOID)
  416. {
  417.     Fclose(PrnHdl);
  418. }
  419.